/**
 * 🔔 消息通知管理工具类
 * 
 * 功能：
 * - 统一管理顶部消息通知
 * - 解析不同类型的融云消息
 * - 触发通知显示
 */

/**
 * 消息通知管理器
 */
class NotificationManager {
  constructor() {
    // 通知组件实例
    this.notificationComponent = null;
    // 通知队列（支持多条消息排队显示）
    this.queue = [];
    // 是否正在显示通知
    this.isShowing = false;
  }
  
  /**
   * 设置通知组件实例
   * @param {Component} component - 通知组件实例
   */
  setComponent(component) {
    console.log('🔔 设置通知组件实例');
    this.notificationComponent = component;
  }
  
  /**
   * 显示通知
   * @param {Object} options - 通知选项
   */
  show(options) {
    if (!this.notificationComponent) {
      console.warn('⚠️ 通知组件未初始化');
      return;
    }
    
    // 将通知加入队列
    this.queue.push(options);
    
    // 如果当前没有显示通知，立即显示
    if (!this.isShowing) {
      this.showNext();
    }
  }
  
  /**
   * 显示下一条通知
   */
  showNext() {
    if (this.queue.length === 0) {
      this.isShowing = false;
      return;
    }
    
    this.isShowing = true;
    const options = this.queue.shift();
    
    // 显示通知
    this.notificationComponent.show(options);
    
    // 通知显示时长 + 300ms 动画时间后，显示下一条
    const duration = options.duration || 3000;
    setTimeout(() => {
      this.showNext();
    }, duration + 300);
  }
  
  /**
   * 解析融云消息并显示通知
   * @param {Object} message - 融云消息对象
   */
  parseAndShow(message) {
    console.log('🔔 解析融云消息:', message);
    
    const options = this.parseRongCloudMessage(message);
    if (!options) {
      return;
    }
    
    // 🔥 判断是否需要显示通知（智能过滤逻辑）
    if (this.shouldShowNotification(message, options)) {
      this.show(options);
    } else {
      console.log('⚠️ 当前正在与该好友聊天，不显示顶部通知');
    }
  }
  
  /**
   * 🔥 判断是否应该显示通知
   * @param {Object} message - 融云原始消息对象
   * @param {Object} options - 解析后的通知选项
   * @returns {boolean} 是否显示通知
   */
  shouldShowNotification(message, options) {
    // 只对聊天消息进行过滤，其他类型消息始终显示
    if (options.type !== 'chat') {
      console.log('✅ 非聊天消息，始终显示通知');
      return true;
    }
    
    try {
      // 获取当前页面栈
      const pages = getCurrentPages();
      if (pages.length === 0) {
        console.log('✅ 没有页面，显示通知');
        return true;
      }
      
      // 获取当前页面
      const currentPage = pages[pages.length - 1];
      const currentRoute = currentPage.route;
      
      console.log('📍 当前页面路径:', currentRoute);
      
      // 判断是否在聊天页面
      if (!currentRoute.includes('pages/chat/index')) {
        console.log('✅ 不在聊天页面，显示通知');
        return true;
      }
      
      // 🔥 在聊天页面，判断是否是当前聊天的好友
      const currentPageData = currentPage.data;
      const currentChatFriendId = String(currentPageData.friendId || '');
      const currentChatFriendPhone = String(currentPageData.friendPhone || '');
      
      // 消息发送者
      const messageSenderId = String(message.senderUserId || '');
      const messageFriendId = String(options.extraData?.friendId || '');
      
      console.log('🔍 聊天页面匹配检查:');
      console.log('  - 当前聊天好友数据库ID:', currentChatFriendId);
      console.log('  - 当前聊天好友手机号:', currentChatFriendPhone);
      console.log('  - 消息发送者手机号:', messageSenderId);
      console.log('  - 消息发送者数据库ID:', messageFriendId);
      
      // 判断是否是同一个好友（通过手机号或数据库ID匹配）
      const isSameFriend = 
        (messageSenderId === currentChatFriendPhone) || // 手机号匹配
        (messageSenderId === currentChatFriendId) ||    // 手机号与数据库ID匹配
        (messageFriendId === currentChatFriendId);       // 数据库ID匹配
      
      if (isSameFriend) {
        console.log('❌ 正在与该好友聊天，不显示通知');
        return false;
      } else {
        console.log('✅ 不是当前聊天好友，显示通知');
        return true;
      }
    } catch (error) {
      console.error('❌ 判断是否显示通知失败:', error);
      // 出错时默认显示通知
      return true;
    }
  }
  
  /**
   * 解析融云消息
   * @param {Object} message - 融云消息对象
   * @returns {Object|null} 通知选项
   */
  parseRongCloudMessage(message) {
    // 消息类型
    const messageType = message.messageType;
    // 消息内容
    const content = message.content;
    
    console.log('📨 消息类型:', messageType);
    console.log('📨 消息内容:', content);
    
    // 🔥 解析文本消息（RC:TxtMsg）
    if (messageType === 'RC:TxtMsg') {
      return this.parseTextMessage(message);
    }
    
    // 🔥 解析自定义消息
    // 可以根据 content.extra 或其他字段判断消息类型
    
    return null;
  }
  
  /**
   * 解析文本消息
   * @param {Object} message - 融云消息对象
   * @returns {Object} 通知选项
   */
  parseTextMessage(message) {
    const content = message.content;
    const messageText = content.content || '';
    const extra = content.extra || '';
    
    console.log('📝 文本消息内容:', messageText);
    console.log('📝 额外数据:', extra);
    console.log('📝 发送者ID:', message.senderUserId);
    
    // 🔥 引入图片处理工具类
    const imageUtil = require('./image.js');
    
    let extraData = null;
    let userName = '';
    let userAvatarUrl = '';
    let friendId = '';
    
    // 尝试解析 extra 字段（JSON格式）
    if (extra) {
      try {
        extraData = typeof extra === 'string' ? JSON.parse(extra) : extra;
        userName = extraData.userName || extraData.username || '';
        userAvatarUrl = extraData.userAvatarUrl || extraData.avatar || '';
        friendId = extraData.friendId || extraData.userId || '';
      } catch (e) {
        console.error('❌ 解析extra失败:', e);
      }
    }
    
    // 🔥 判断消息类型（根据消息内容关键词）
    let type = 'chat'; // 默认为普通聊天消息
    
    if (messageText.includes('好友申请') || messageText.includes('加好友')) {
      type = 'friend_request';
    } else if (messageText.includes('申请加入') || messageText.includes('加入活动')) {
      type = 'activity_join';
    } else if (messageText.includes('同意') || messageText.includes('通过')) {
      type = 'activity_approved';
    } else if (messageText.includes('拒绝')) {
      type = 'activity_rejected';
    }
    
    // 🔥 对于普通聊天消息，需要从发送者ID推断好友ID和手机号
    let friendPhone = message.senderUserId; // 融云用户ID就是手机号
    if (type === 'chat' && !friendId) {
      // 尝试从手机号转换为数据库ID
      friendId = this._convertRongCloudUserIdToFriendId(message.senderUserId);
    }
    
    return {
      content: messageText,
      type: type,
      avatarUrl: imageUtil.processAvatar(userAvatarUrl), // 🔥 使用图片工具类处理头像
      userName: userName,
      extraData: {
        ...extraData,
        friendId: friendId, // 数据库ID（用于本地存储）
        friendPhone: friendPhone, // 🔥 新增：手机号（融云用户ID，用于发送消息）
        userName: userName,
        userAvatarUrl: imageUtil.processAvatar(userAvatarUrl) // 🔥 使用图片工具类处理头像
      },
      duration: 3000
    };
  }
  
  /**
   * 🔥 将融云用户ID（手机号）转换为数据库用户ID（参考Flutter项目）
   * @param {string} rongCloudUserId - 融云用户ID（手机号）
   * @returns {string} 数据库用户ID
   */
  _convertRongCloudUserIdToFriendId(rongCloudUserId) {
    console.log('🔄 转换融云用户ID（手机号）→ 数据库ID:', rongCloudUserId);
    
    // 🔥 动态从本地存储获取映射关系
    const storage = require('./storage.js');
    const phoneToIdMap = storage.get('phone_to_id_map') || {};
    
    // 查找映射
    const databaseId = phoneToIdMap[rongCloudUserId];
    
    if (databaseId) {
      console.log('✅ 找到映射: 手机号', rongCloudUserId, '→ 数据库ID', databaseId);
      return databaseId;
    } else {
      console.warn('⚠️ 未找到映射，使用手机号作为ID:', rongCloudUserId);
      console.warn('💡 提示：映射表可能未初始化，将在加载好友列表后自动建立');
      // 如果没有映射，返回手机号本身（向后兼容）
      return rongCloudUserId;
    }
  }
  
}

// 创建单例
const notificationManager = new NotificationManager();

/**
 * 🔥 更新手机号到数据库ID的映射关系
 * @param {string} phone - 手机号
 * @param {string} userId - 数据库用户ID
 */
function updatePhoneToIdMapping(phone, userId) {
  if (!phone || !userId) return;
  
  const storage = require('./storage.js');
  const phoneToIdMap = storage.get('phone_to_id_map') || {};
  phoneToIdMap[phone] = String(userId);
  storage.set('phone_to_id_map', phoneToIdMap);
  
  console.log('✅ 更新映射: 手机号', phone, '→ 数据库ID', userId);
}

/**
 * 显示通知（快捷方法）
 * @param {Object} options - 通知选项
 */
function showNotification(options) {
  notificationManager.show(options);
}

/**
 * 显示加好友通知
 * @param {string} userName - 用户名
 * @param {string} avatarUrl - 用户头像
 */
function showFriendRequest(userName, avatarUrl) {
  const imageUtil = require('./image.js');
  showNotification({
    content: '收到一条新的好友申请',
    type: 'friend_request',
    userName: userName,
    avatarUrl: imageUtil.processAvatar(avatarUrl), // 🔥 使用图片工具类处理头像
    duration: 3000
  });
}

/**
 * 显示活动申请通知
 * @param {string} userName - 用户名
 * @param {string} avatarUrl - 用户头像
 * @param {string} activityId - 活动ID
 */
function showActivityJoin(userName, avatarUrl, activityId) {
  const imageUtil = require('./image.js');
  showNotification({
    content: '申请加入您的活动',
    type: 'activity_join',
    userName: userName,
    avatarUrl: imageUtil.processAvatar(avatarUrl), // 🔥 使用图片工具类处理头像
    extraData: { activityId },
    duration: 3000
  });
}

/**
 * 显示活动审核通过通知
 * @param {string} activityTitle - 活动标题
 */
function showActivityApproved(activityTitle) {
  showNotification({
    content: `您的活动申请已通过：${activityTitle}`,
    type: 'activity_approved',
    duration: 3000
  });
}

/**
 * 显示活动审核拒绝通知
 * @param {string} activityTitle - 活动标题
 */
function showActivityRejected(activityTitle) {
  showNotification({
    content: `您的活动申请已被拒绝：${activityTitle}`,
    type: 'activity_rejected',
    duration: 3000
  });
}

/**
 * 显示系统消息通知
 * @param {string} content - 消息内容
 */
function showSystemMessage(content) {
  showNotification({
    content: content,
    type: 'system',
    duration: 3000
  });
}

module.exports = {
  notificationManager,
  showNotification,
  showFriendRequest,
  showActivityJoin,
  showActivityApproved,
  showActivityRejected,
  showSystemMessage,
  updatePhoneToIdMapping  // 🔥 导出映射更新函数
};

